package juego;

import java.util.ArrayList;
import java.util.Iterator;

public class Bombardero extends Armado {
	
	//Atributos de clase
	private static int miImpacto = 20;
	private static int miPuntajePorDestruccion = 30;
	private static int miResistenciaMaxima = 17;
	private static int miTamanio = 8;
	private static int miVelocidad = 5;
	private static int miTiempoEspera = 3;
	
	//Atributos de instancia
    private int sentido;
    private int contador;
    
    
    //metodos
    
    //Constructor recibe Coordenada
    public Bombardero(Coordenada coordenada){
    	super(coordenada, miResistenciaMaxima, miTiempoEspera);
    	this.sentido = 1;
    	this.contador = 0;
    	ArmaLaser unArmaLaser = new ArmaLaser();
    	this.armamento.add(unArmaLaser);
    	ArmaCohete unArmaCohete = new ArmaCohete();
    	this.armamento.add(unArmaCohete);
    	ArmaTorpedoRastreador unArmaTorpedoR = new ArmaTorpedoRastreador();
    	this.armamento.add(unArmaTorpedoR);
    }
    
    //Constructor recibe 2 enteros
    public Bombardero(int x, int y){
    	super(new Coordenada(x,y), miResistenciaMaxima, miTiempoEspera);
    	this.sentido = 1;
    	this.contador = 0;
    	ArmaLaser unArmaLaser = new ArmaLaser();
    	this.armamento.add(unArmaLaser);
    	ArmaCohete unArmaCohete = new ArmaCohete();
    	this.armamento.add(unArmaCohete);
    	ArmaTorpedoRastreador unArmaTorpedoR = new ArmaTorpedoRastreador();
    	this.armamento.add(unArmaTorpedoR);
    }

        
    @Override
	protected int velocidad() {
		return miVelocidad;
	}

    //Devuelve el tamanio de el bombardero
	@Override
	public int verTamanio() {
		return miTamanio;
	};

    
	//Devuelve el impacto provocado
    @Override
	public Impacto impactoProvocado(){
    	return new ImpactoLineal(miImpacto);
	};  
	
    
    //Devuelve el puntaje por haber sido destruido
    public int puntajePorDestruccion(){
    	return miPuntajePorDestruccion;
    };


    @Override   
    protected void movimientoPropio(){
    	int movimiento;
    	movimiento = (miVelocidad * sentido);
    	this.ubicacion.moverEnX(movimiento);
    	this.ubicacion.moverEnY(5);
    	this.contador++;
    	if (this.contador >= 3){
    		this.contador = 0;
    		this.sentido = ((-1) * this.sentido);
    	};
    };
    
    
    //redefinicion
    protected void disparar(ArrayList<Movil> listaDeMoviles){
    	int lugarDeDisparo;
    	if (this.vivo) {
    		if (this.cronometro.puedoActuar()){
    			lugarDeDisparo = -1;
    			Iterator<Disparable> iterador = armamento.iterator();
    			while (iterador.hasNext()){
    				Disparable arma = iterador.next();
    			
    				try {
    					int coordenadaX = ubicacion.obtenerCoordenadaX() + lugarDeDisparo;
    					int coordenadaY = ubicacion.obtenerCoordenadaY();
    					Coordenada otraCoordenada = new Coordenada(coordenadaX,coordenadaY);
    					Proyectil proyectil = arma.disparar(otraCoordenada);
    					listaDeMoviles.add(proyectil);
    				}//manejo de excepcion
    				catch (Exception excepcion){};
    				lugarDeDisparo++;	
    			}
    		}
    		else{
    			throw new ExcepcionEsperaInsuficiente();
    		}
    	}
    }	
    
    
    //Retorna el puntaje. Este metodo se encarga de la destruccion y liberacion
    //de las armas.
    @Override
    protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		int puntaje = 0;
		Iterator<Movil> iterador = listaDeMoviles.iterator();
		boolean contacto;
				
		while (iterador.hasNext()){
			
			Movil movil = iterador.next();
			try {
				contacto = movil.huboContacto(this);
				
				//solo puede ser impactado por el algo42 o proyectiles de este
				if (contacto & movil.verLealtad()){
					
					//recibe el impacto
					movil.impactoProvocado().herir(this.resistencia);
										
					//provoca el impacto
					movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
					
					//si no esta vivo lo elimina de la lista
					if (!movil.estaVivo()){
						iterador.remove();
					};
				}
			}
			catch (Exception e){}
		}
		
		if (!this.resistencia.quedaEnergia()){
			//deja el botin
			this.dejarBotin(listaDeBotines);
			this.destruirse(listaDeMoviles);
			puntaje = this.puntajePorDestruccion();
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
		}
		return puntaje;
	};
	
	
	@Override
	public int recibirImpacto(Impacto danio, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		danio.herir(this.resistencia);
		if (resistencia.quedaEnergia()){
			return 0;
		}
		else {
			//deja el botin
			this.dejarBotin(listaDeBotines);
			this.vivo = false;
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
			return this.puntajePorDestruccion();}
		};
		

	private void dejarBotin(ArrayList<Botin> listaDeBotines) {
		Botin armamento = new MejoraArmamento(this.ubicacion);
		listaDeBotines.add(armamento);
	}

	

}    
